/**
 * @author liaosh
 * @date 2022-10-15 18:08
 */
public class Singleton {
    private static Singleton instance;
    private static final Object LOCK = new Object();

    /**
     * 外部无法通过 new 实例化
     */
    private Singleton() {

    }

    public static Singleton getInstance() {
        if (instance == null) {
            // 加锁
            synchronized (LOCK) {
                // 使用双重锁定：避免重复实例化
                // 多个线程进入第一个 if 代码块后，等待锁，得到锁之后进入 synchronized 代码块
                // 如果前一个线程已经实例化过，则不再进入第二个 if 代码块
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

    public void print(String str) {
        System.out.println("Singleton.print " + str);
    }
}
